iT邦幫忙

2021 iThome 鐵人賽

DAY 9
1

Keyword: Kotlin DSL
到Day9使用Kotlin DSL 管理依賴的Code放在
KMMDay9


集中管理依賴版本

在使用第三方庫的時候,有時候可能同時使用到許多不同的模組,像是昨天的ktor就使用到了 core/ json /logging / okhttp 等等不同的Ktor模組.而在使用這些模組時,如果使用到了不同的版本,例如core更新到了2.3.1,而logging只有1.0.0,就有可能發生意料之外的錯誤,所以除了官方有明確說明可以混用,不然還是統一使用同一個版本號較為安全.

在以往只有一個Gradle檔案管理依賴時,會在這個Gradle檔案中使用version常數作為版本的管理,當要修改內容時只要修改這邊即可.這也是業界常見的做法.

但是KMM由於跨平台的特性,所以KMM專案具有多個gradle各自為政,使用不同版本的依賴還是有發生問題的可能,這時把版本號放在各個gradle中就不是合適的做法了.

新人加入後可能只有改變其中一個gradle的版本號,而其他的部分忘記修改或是根本不知道其他部分有使用到.

最慘的是,專案表面上是看不出什麼異狀的,要一直等到某天突然執行到這個情境.隱藏的地雷爆炸.才又花上大精力去補救.

好在Kotlin也有考慮到這個問題,我們可以使用Kotlin DSL功能 來進行版本的統一管理.

在Android Studio內,切換成專案頁面,然後在專案的根目錄建立一個名為buildSrc的路徑

https://github.com/officeyuli/itHome2021/raw/main/day8/progject%20root.jpg

建立好之後在其中再增加一個名為build.gradle.kts的檔案,並且填上Kotlin-DSL的依賴,有了這幾行文字並編譯後,Gradle就能認出來這是給Gradle使用的Kotlin DSL

plugins{
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

這時候gradle仍然認為這只是一般檔案,所以請進行Gradle sync

之後就在這個路徑底下,建立起src/main/java的路徑,在裡面建立起一個Dependencies.kt的檔案,這邊就是我們以後管理各個版本的區塊

全部完成後,會像這樣

https://github.com/officeyuli/itHome2021/raw/main/day8/Dependencieskt.jpg

然後把前幾天寫的Gradle引用逐漸搬進來這個新建立的檔案,首先先抽出版本號,現在有用到的是Ktor與Kotlin serialization,將各gradle內的版本都集中起來

object Versions{
    val ktor = "1.6.3"
    val serialization_version = "1.5.21"
}

然後我們再建立一個Develop物件,裡面放入Develop環境所使用的依賴,就像這樣

object Develop{
    object Ktor{
        val commonCore = "io.ktor:ktor-client-core:${Versions.ktor}"
        val commonJson = "io.ktor:ktor-client-json:${Versions.ktor}"
        val commonLogging = "io.ktor:ktor-client-logging:${Versions.ktor}"
        val androidCore = "io.ktor:ktor-client-okhttp:${Versions.ktor}"
        val ios = "io.ktor:ktor-client-ios:${Versions.ktor}"
        val commonSerialization = "io.ktor:ktor-client-serialization:${Versions.ktor}"
    }
}

由於在實務上,有可能Develop環境與正式環境有不同的依賴,所以會獨立開來寫,這樣在進行編譯的時候就能使用到不同的參數.

如法炮製,把serialization的依賴也加入到Develop中,全部寫完後記得再次Sync gradle

之後就能在其他的build.gradle中直接使用,使用的方法可以直接呼叫,非常方便,以shared內的gradle為例

...
sourceSets {
        val commonMain by getting {
            dependencies {
                implementation(Develop.Ktor.commonCore)
                implementation(Develop.Ktor.commonJson)
                implementation(Develop.Ktor.commonLogging)
                implementation(Develop.Ktor.commonSerialization)
                implementation(Develop.Coroutines.common)
            }
        }
...
}

如何,是不是清楚多了?並且需要更新時只要修改Dependencies內的數據,便會整個專案一起修改.

準備好所有工具後,我們明天正式開始寫Ktor,來進行網路請求.


上一篇
Day 8:工欲善其事,必先利其器,準備好Gradle依賴
下一篇
Day 10:讓你見識我的一小部分力量,Ktor的網路請求
系列文
挑戰 Kotlin Multiplatform Mobile 跨平台開發,透過共同的Kotlin模組同時打造iOS與Android應用!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言